package cn.edu.njnu.opengmpback.collaboration.repository;

import cn.edu.njnu.opengmpback.collaboration.entity.CollabProject;
import org.springframework.data.mongodb.repository.MongoRepository;
// import org.springframework.stereotype.Repository;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.rest.core.annotation.RepositoryRestResource;
    
/**
 * @author ayang
 * @description 协作项目的数据访问层
 */
// @Repository
// * `@Repository`: 这个注解告诉 Spring 框架，这个接口是一个“仓库”，是用来和数据库打交道的。Spring 会为它创建一个可以被其他组件（如 Service）注入的实例。
//  public interface CollabProjectRepository extends MongoRepository<CollabProject, String> {
// 我们定义的是一个接口，而不是一个具体的实现类。这是 Spring Data的一个核心特点，我们只定义“需要做什么”，而具体的实现由框架在运行时自动生成。
// Spring Data MongoDB 会根据方法名自动生成查询
// 例如，我们可以定义一个根据创建者ID查找项目列表的方法：
// List<CollabProject> findByCreatorId(String creatorId);





@RepositoryRestResource(path = "application")
public interface CollabProjectRepository extends MongoRepository<CollabProject, String> {
    public Page<CollabProject> findCollabProjectsByPrivacyIsNot(String privacy, Pageable pageable);

    public Page<CollabProject> findCollabProjectsByPrivacyIsNotAndCategoryEquals(String privacy, String categtory, Pageable pageable);

    public Page<CollabProject> findCollabProjectsByPrivacyIsNotAndCategoryEqualsAndTagContaining(String privacy, String categtory, String tag, Pageable pageable);


    public Page<CollabProject> findCollabProjectsByPrivacyIsAndCreatorIsOrPrivacyIsNot(String privacy, String creator, String privacy2, Pageable pageable);

    public Page<CollabProject> findCollabProjectsByPrivacyIsAndCreatorIsOrPrivacyIsNotAndCategoryEquals(String privacy, String creator, String privacy2, String categtory, Pageable pageable);

    public Page<CollabProject> findCollabProjectsByPrivacyIsAndCreatorIsOrPrivacyIsNotAndCategoryEqualsAndTagContaining(String privacy, String creator, String privacy2, String categtory, String tag, Pageable pageable);


    public Page<CollabProject> findCollabProjectsByNameLikeOrDescriptionLikeAndPrivacyIsNot(String name, String description, String privacy, Pageable pageable);

    public Page<CollabProject> findCollabProjectsByNameLikeOrDescriptionLikeAndPrivacyIsAndCreatorIsOrPrivacyIsNot(String name, String description, String privacy, String creator, String privacy2, Pageable pageable);
}



// 🎯 总结与推荐
// 推荐方案：
// 使用 @Repository:
// 提供更好的业务逻辑控制
// 符合分层架构的最佳实践
// 自己写 CollabProjectController:
// 实现复杂的查询逻辑
// 调用 JsonResult 封装返回结果
// 对于复杂查询使用 @Query:
// 提高代码可读性
// 为什么不推荐 @RepositoryRestResource？
// 业务逻辑受限: 难以实现复杂的权限控制和数据处理。
// 性能问题: 可能会暴露过多的数据。
// 不符合分层架构: 将数据访问层直接暴露为API，绕过了业务逻辑层。

    // }